#include "HD.h"
#include "stm32f1xx_hal_exti.h"
#include "../DWT/dwt.h"
uint8_t HD_dates[8];
#define NUM_SENSORS 8
#define CENTER_SENSOR (NUM_SENSORS / 2)
volatile uint8_t sensor_data = 0; // 用于存储读取到的数据
volatile uint8_t sensor_bit_count = 0; // 当前读取的位数
// 计算偏移量
int calculate_offset() {
    int offset = 0; // 默认偏移量为0
    for (int i = 0; i < NUM_SENSORS; i++) {
        if (HD_dates[i] == 0) { // 检测到黑线
            offset = i - CENTER_SENSOR; // 计算偏移量
            break; // 退出循环
        }
    }
    return offset;
}

uint8_t gw_gray_serial_read()
{
    uint8_t ret = 0;
    uint8_t i;

    for (i = 0; i < 8; ++i) {
        /* 输出时钟下降沿 */
        HAL_GPIO_WritePin(HD_SLK_GPIO_Port, HD_SLK_Pin,GPIO_PIN_RESET);
        dwt_delay_us(2);
        //避免GPIO翻转过快导致反应不及时
        ret |= 	HAL_GPIO_ReadPin(HD_SDA_GPIO_Port, HD_SDA_Pin) << i;

        /* 输出时钟上升沿,让传感器更新数据*/
        HAL_GPIO_WritePin(HD_SLK_GPIO_Port, HD_SLK_Pin,GPIO_PIN_SET);

        /* 延迟需要在5us左右 */
        dwt_delay_us(5);
    }

    return ret;
}
float calculate_offset_switch()
{
    uint8_t read= gw_gray_serial_read();
    float out;
    switch (read) {
        case 127:  out = -2;     break; //0111 1111 偏左

        case 191:                       //1011 1111
        case 63:   out = -1.5;   break; //0011 1111

        case 223:                       //1101 1111
        case 159:  out = -0.5;     break; //1001 1111

        case 239:                       //1110 1111
        case 207:  out = -0.3;   break; //1100 1111

        case 231:  out = 0;      break; //1110 0111

        case 247:                       //1111 0111
        case 243:  out = 0.3;    break; //1111 0011

        case 251:                       //1111 1011
        case 249:  out = 0.5;      break; //1111 1001

        case 253:                       //1111 1101
        case 252:  out = 1.5;    break; //1111 1100

        case 254:  out = 2;      break; //1111 1110 偏右

        case 255:  out = 255;      break; //1111 1111 全为白
        default:   out = -25;      break; //异常
    }
    return  out;
}
uint8_t* HD_read_dates()
{
    uint8_t buf_date = gw_gray_serial_read(); // 假设这个函数返回一个 uint8_t 类型的值

    // 逐位提取并存储到数组中
    HD_dates[0] = (buf_date >> 0) & 0x01;
    HD_dates[1] = (buf_date >> 1) & 0x01;
    HD_dates[2] = (buf_date >> 2) & 0x01;
    HD_dates[3] = (buf_date >> 3) & 0x01;
    HD_dates[4] = (buf_date >> 4) & 0x01;
    HD_dates[5] = (buf_date >> 5) & 0x01;
    HD_dates[6] = (buf_date >> 6) & 0x01;
    HD_dates[7] = (buf_date >> 7) & 0x01;
    return HD_dates; // 返回数组的首地址
}
void HD_Init()
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_GPIOA_CLK_ENABLE();
    GPIO_InitStruct.Pin = GPIO_PIN_1; // 假设使用PA1作为数据信号
    GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; // 上升沿和下降沿触发
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    // 启用中断
    HAL_NVIC_SetPriority(EXTI1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(EXTI1_IRQn);
}


// 灰度传感器中断服务例程
void HD_ISR(void) {
    static uint8_t data = 0; // 临时存储数据

    // 读取数据线状态
    uint8_t bit = HAL_GPIO_ReadPin(HD_SDA_GPIO_Port, HD_SDA_Pin);

    // 将读取到的位存储到临时变量中
    data |= (bit << sensor_bit_count);

    // 更新位计数
    sensor_bit_count++;

    // 如果已经读取完8位
    if (sensor_bit_count == 8) {
        // 将数据存储到全局变量中
        sensor_data = data;

        // 重置临时变量和位计数
        data = 0;
        sensor_bit_count = 0;

        // 可以在这里触发其他处理函数
    }
}
//void HD_Init()
//{
//    // 配置时钟线为输出模式
//    HAL_GPIO_WritePin(HD_SLK_GPIO_Port, HD_SLK_Pin, GPIO_PIN_RESET);
//
//    // 配置中断优先级（根据实际情况设置）
//    HAL_NVIC_SetPriority(HD_IRQn, 0, 0);
//    HAL_NVIC_EnableIRQ(HD_IRQn);
//
//    // 配置时钟线为中断模式（上升沿或下降沿触发）
//    HAL_GPIO_Init(HD_SLK_GPIO_Port, &GPIO_InitStruct);
//}